package com.ltu.util.common;

import java.math.BigDecimal;



/**
 * 数学计算工具类
 * Create by ZengJianHua
 * 2014年9月28日  下午3:32:46 
 * version 
 */
public class MathUtils {
	/**   
	* 提供精确的加法运算。   
	* @param v1 被加数   
	* @param v2 加数   
	* @return 两个参数的和   
	*/    
	public static BigDecimal add(double v1,double v2){     
	BigDecimal b1 = new BigDecimal(Double.toString(v1));     
	BigDecimal b2 = new BigDecimal(Double.toString(v2));     
	return b1.add(b2);     
	}     
	/**   
	* 提供精确的减法运算。   
	* @param v1 被减数   
	* @param v2 减数   
	* @return 两个参数的差   
	*/    
	public static BigDecimal sub(double v1,double v2){     
	BigDecimal b1 = new BigDecimal(Double.toString(v1));     
	BigDecimal b2 = new BigDecimal(Double.toString(v2));     
	return b1.subtract(b2);     
	} 
	
	/**   
	* 比较两个数的大小。   
	* @param v1 被减数   
	* @param v2 减数   
	* @return 两个参数的差   
	*/    
	public static double compare(double v1,double v2){     
	BigDecimal v = new BigDecimal(0);
	v = sub(v1, v2);
	return v.doubleValue();     
	}     
	
	
	/**   
	* 提供精确的乘法运算。   
	* @param v1 被乘数   
	* @param v2 乘数   
	* @return 两个参数的积   
	*/    
	public static BigDecimal mul(double v1,double v2){     
	BigDecimal b1 = new BigDecimal(Double.toString(v1));     
	BigDecimal b2 = new BigDecimal(Double.toString(v2));     
	return b1.multiply(b2);     
	}     
	/**   
	* 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到   
	* 小数点以后10位，以后的数字四舍五入。   
	* @param v1 被除数   
	* @param v2 除数   
	* @return 两个参数的商   
	*/    
	public static double div(double v1,double v2){     
	return div(v1,v2,10);     
	}     
	/**   
	* 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指   
	* 定精度，以后的数字四舍五入。   
	* @param v1 被除数   
	* @param v2 除数   
	* @param scale 表示表示需要精确到小数点以后几位。   
	* @return 两个参数的商   
	*/    
	public static double div(double v1,double v2,int scale){     
	if(scale<0){     
	throw new IllegalArgumentException(     
	"The scale must be a positive integer or zero");     
	}     
	BigDecimal b1 = new BigDecimal(Double.toString(v1));     
	BigDecimal b2 = new BigDecimal(Double.toString(v2));     
	return b2.divide(b1,scale,BigDecimal.ROUND_HALF_UP).doubleValue();     
	}     
	/**   
	* 提供精确的小数位四舍五入处理。   
	* @param v 需要四舍五入的数字   
	* @param scale 小数点后保留几位   
	* @return 四舍五入后的结果   
	*/    
	public static BigDecimal round(double v,int scale){     
	if(scale<0){     
	throw new IllegalArgumentException("The scale must be a positive integer or zero");     
	}     
	BigDecimal b = new BigDecimal(Double.toString(v));     
	BigDecimal one = new BigDecimal("1");     
	return b.divide(one,scale,BigDecimal.ROUND_HALF_UP);     
	}

	/**
	 * 获取2个值之间的随机数
	 * @param smin
	 * @param smax
	 * @return
	 */

	public static long randomnum(int smin, int smax){
		int range = smax - smin;
		double rand = Math.random();
		return (smin + Math.round(rand * range));
	}
};    


